package com.wang.validator.config;

import org.apache.commons.lang3.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author: wangning
 * @date: 2024/1/2 16:25
 */
@ControllerAdvice
@Slf4j
public class GlobalHandle {

//    /**
//     * 直接抛出异常，只能抛出第一个
//     *
//     * @param e
//     * @return
//     */
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    @ResponseBody
//    @ResponseStatus(HttpStatus.OK)
//    public String exception(MethodArgumentNotValidException e){
//        log.error(e.getMessage());
//        return e.getMessage();
//    }
//
//    /**
//     * 可抛出所有异常
//     *
//     * @param exception
//     * @return
//     */
//    @ResponseBody
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ExceptionHandler(MethodArgumentNotValidException.class)
//    public String exceptionHandler(MethodArgumentNotValidException exception){
//        BindingResult result = exception.getBindingResult();
//        StringBuilder stringBuilder = new StringBuilder();
//        if (result.hasErrors()) {
//            List<ObjectError> errors = result.getAllErrors();
//            if (errors != null) {
//                errors.forEach(p -> {
//                    FieldError fieldError = (FieldError) p;
//                    log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",
//                            fieldError.getObjectName(),
//                            fieldError.getField(),
//                            fieldError.getDefaultMessage());
//                    stringBuilder.append(fieldError.getDefaultMessage());
//                });
//            }
//        }
//        return stringBuilder.toString();
//    }

    /**
     * rds项目抽取
     *
     * @param ex
     * @return
     */
    @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})
    @ResponseBody
    @ResponseStatus(HttpStatus.OK)
    public String bindException(BindException ex) {
        List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();
        List<ObjectError> globalErrors = ex.getBindingResult().getGlobalErrors();
        List<String> messages = new ArrayList<>();
        //handle field errors
        for (FieldError fieldError : fieldErrors) {
            if (fieldError.isBindingFailure()) {
                messages.add(fieldError.getField() + " property value convert failed");
            } else {
                messages.add(fieldError.getDefaultMessage());
            }
        }
        //handle global errors, not sure about the existing situation right now, but leave it here for contingencies
        for (ObjectError objectError : globalErrors) {
            messages.add(objectError.getDefaultMessage());
        }
        log.error("[参数校验异常]: {}", StringUtils.join(messages, "; "), ex);
        return Arrays.toString(messages.toArray());
    }

//    @ExceptionHandler(BindException.class)
//    @ResponseBody
//    @ResponseStatus(HttpStatus.OK)
//    public String exception(BindException e){
//        return e.getMessage();
//    }

}
